﻿using LibNiconico.NiconicoApi.HeartBeat;
using LibNiconico.NiconicoApi.Lives.WayBackKey;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LibNiconico.NiconicoApi.Lives.Comments
{
    /// <summary>
    /// ニコニコ生放送コメントクライアント
    /// </summary>
    public interface INicoLiveCommentClient:IDisposable
    {
        /// <summary>
        /// 接続中か判定
        /// </summary>
        bool Connected { get; }

        /// <summary>
        /// コメント送信可能か判定
        /// </summary>
        bool IsSendAble { get; }

        /// <summary>
        /// ニコニコ生放送接続情報
        /// </summary>
        NicoLiveCommentConnectionInfo ConnectionInfo { get; }

        /// <summary>
        /// キープアライブ間隔
        /// </summary>
        TimeSpan KeepAliveTimeSpan { get; set; }

        /// <summary>
        /// スレッドコメント受信イベント
        /// </summary>
        event NicoLiveThreadCommentHandler ThreadReceived;

        /// <summary>
        /// チャットコメント送信結果受信イベント
        /// </summary>
        event NicoLiveChatResultCommentHandler ChatResultReceived;

        /// <summary>
        /// チャットコメント受信イベント
        /// </summary>
        event NicoLiveChatCommentHandler ChatReceived;

        /// <summary>
        /// 切断イベント
        /// </summary>
        event NicoLiveCloseHandler Closed;

        /// <summary>
        /// 読取例外イベント
        /// </summary>
        event NicoLiveReadExceptionHandler ReadException;

        /// <summary>
        /// ハートビートクライアント
        /// </summary>
        INiconicoHeartBeatClient HeartBeatClient { get; }
        
        /// <summary>
        /// 非同期に接続
        /// </summary>
        /// <returns></returns>
        Task ConnectAsync();

        /// <summary>
        /// 非同期に接続
        /// </summary>
        /// <param name="extendInfo"></param>
        /// <returns></returns>
        Task ConnectAsync(NicoLiveCommentConnectionExtendInfo extendInfo);

        /// <summary>
        /// 非同期に主コメント送信
        /// </summary>
        /// <param name="ownerComment"></param>
        /// <returns></returns>
        Task<bool> SendOwnerChatCommentAsync(NicoLiveOwnerChatComment ownerComment);

        /// <summary>
        /// 非同期に過去コメント受信要求を送信
        /// </summary>
        /// <param name="queryInfo"></param>
        /// <returns></returns>
        Task SendWayBackRequest(NicoLiveGetWayBackRequestQueryInfo queryInfo);

        /// <summary>
        /// 非同期にコメントを送信
        /// </summary>
        /// <param name="submitChatComment"></param>
        /// <returns></returns>
        Task SendAsync(NicoLiveSubmitChatComment submitChatComment);




    }
}
